home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-03-08 | 41.8 KB | 2,467 lines |
-
- *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- *
- * xb.has …… ぺけ-BASICのコンパイラ本体(メイン)
- * こ-BASICのコンパイラ本体(メイン)
- *
- *━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
- .include kob.h
- .include doscall.mac
- .include iocscall.mac
- .include fefunc.h
- .include variable.h
-
-
- .xref ko_debug
- .xref ko_dec_print
- .xref ko_hex_print
- .xref _bwp
- .xref _WindowClose
- .xref _WindowConnectionClose
-
- .xref statement_check
- .xref first_check_a5
- .xref first_check_a5_in_line
- .xref 行末まで飛ばし
- .xref hash
- .xref hash_label特別
- .xref make_hash_istable
- .xref stat解釈
- .xref variable_check
- .xref math解釈
- .xref function解釈
- .xref function_check
- .xref global変数リスト作成
- .xref 未宣言をint_sub
- .xref system関数table作成
- .xref system変数table作成
- .xref dim_init_data
- .xref int定数get
-
- .xref one_check
- .xref 型get
- .xref 型getS
- .xref 名前登録
- .xref label_sub
-
- .xref If_end
- .xref Else
- .xref else_check
-
-
-
- .text
- .even
- .xdef _kobas_init
- _kobas_init:
- movem.l 4(sp),d2/a2 * argc/argv
- movem.l d3-d7/a3-a6,-(sp)
-
- move.l #_WORK,d3
- move.l #$c0_0000,-(sp)
- DOS _MALLOC
- andi.l #$ff_fff0,d0
- cmp.l d3,d0
- bcs mem_err0
- move.l d0,d1 * メモリ確保量
- move.l d0,(sp)
- DOS _MALLOC * メモリ最大確保(後でSETBLOCKでサイズ再調整)
- addq.l #4,sp
-
- movea.l d0,a6
- move.l sp,SP_kobas_init * エラーなどで途中で抜ける時のため
- lea.l a6保存(pc),a1
- move.l d0,(a1) * 基本ワーク先頭(不変)
-
- add.l d3,d0
- movea.l d0,a4 * 基本ワークの次のアドレス
- add.l a6,d1
- move.l d1,mem_last * 現在のワーク全体の末尾アドレス
-
-
-
- * コンパイル用変数の初期化処理
-
- moveq #0,d7 * フラグリセット
- moveq #-1,d0
-
- movem.l d2/a2,b_argc * 引き数列(とりあえず)
- move.l d7,errorno
- move.l d7,行数
- move.w d7,EXITcode
- move.w d7,fkeyflag
- move.b d7,sinitFLAG
- move.w d0,関数file数
- move.w d0,breakcheck
- move.w d0,tagFP
- movem.l d0/d7,EXTENDmask * OFFmask/ONmask
- move.w #1,xb動作mode * kobas_init 呼び出し中
- move.b d0,global_flag
-
- move.w d7,_FREEMEM(a6)
- move.b d7,cnf_filename
-
-
-
- pea.l 起動dir
- move.l (a2)+,-(sp) * argv[0] : 起動されたドライブ+パス名+コマンド名
- DOS _NAMECK
- addq.l #8,sp
- bsr com_est
-
- bsr make_hash_istable * ハッシュ値計算高速化のためのテーブル作成
-
-
- ** ** ** ** ** ** 初期化終了
-
- move.w #-1,関数file数
- * kob.cnf を読み込む。
- bsr cnf_read
-
- movem.l EXTENDmask,d0/d1
- and.l d0,d7 * OFFmask
- or.l d1,d7 * ONmask
-
- clr.l 行数
-
-
-
- * 外部関数を読み込んで、ハッシュ値順に並べ直す
- bsr func_read
-
-
- move.l a4,strbuf
- adda.l #strbufSIZE,a4
-
- move.l a4,nest_work
- adda.l #nest_workSIZE,a4
-
- move.l a4,program_area
-
-
-
- * フリーエリア指定サイズ確保
- moveq #0,d0
- move.w _FREEMEM(a6),d0
- bne @f
- move.w #$100,d0 * default
- @@:
- moveq #10,d1
- lsl.l d1,d0 * 1K 倍
-
- lea.l (a4,d0.l),a1
- cmpa.l mem_last,a1
- bhi mem_err1
- move.l a4,MEM1
- move.l a1,MEM2
- move.l a1,mem_last
-
- suba.l a6,a1
- move.l a1,-(sp)
- move.l a6,-(sp)
- DOS _SETBLOCK
- addq.l #8,sp
-
-
-
-
- bsr system関数table作成
- bsr system変数table作成
-
-
-
-
-
- ** ** ** ** ** **
- * .xdef restart
- *restart:
- move.l MEM2,mem_last
- clr.w EXITcode
- bclr #warningF,d7
- bclr #modeF,d7
-
-
- * BASICのファイルを読み込む
- lea.l basic_filename,a2
- clr.w -(sp)
- move.l a2,-(sp)
- DOS _OPEN
- tst.l d0
- bge 1f
-
- @@:
- tst.b (a2)+
- bne @b
- move.b #'.',-1(a2)
- move.b #'k',(a2)+
- move.b #'o',(a2)+
- move.b #'b',(a2)+
- clr.b (a2)
- DOS _OPEN
- tst.l d0
- bmi help
- 1:
-
- move.l program_area,a5
- move.l mem_last,d1
- sub.l a5,d1
- bcs mem_err
- move.l d1,-(sp)
- * move.l a5,-(sp)
- pea.l 1(a5) * 行番号対策など
- move.w d0,-(sp)
- DOS _READ
- lea.l 1(a5,d0.l),a2 * last address
- clr.b (a2)
- addq.l #1+1+3,d0
- andi.b #$fc,d0
- lea.l (a5,d0.l),a4
- cmp.l d1,d0
- bcc mem_err
- DOS _CLOSE
- lea.l 16(sp),sp
-
-
-
-
-
- * ベーシック内部で使用する変数の初期化
-
- moveq #-1,d0 * 登録された個数 - 1
- move.w d0,4+変数int
- move.w d0,4+変数str
- move.w d0,4+変数char
- move.w d0,4+変数float
- move.w d0,4+配列
-
- move.w d0,8+中間言語行数
- move.w d0,8+変数INIT
- move.w d0,8+引数INIT
- move.w d0,8+行番号
- move.w d0,8+ラベル
- move.w d0,8+goto飛先
-
- movea.l nest_work,a0
- clr.l (a0)+
-
- clr.w 4+名前
-
- bsr 内部関数
-
-
- move.l a4,中間言語
- move.l a4,$c+中間言語行数
-
-
-
-
- move.l program_area,a5
- addq.l #1,a5
-
- bset #no_cnfF,d7
-
- bsr first_check_a5_in_line
- tst.w d0
- bne @f
- bset #linenumF,d7 *行番号あり
- @@:
-
- move.b #$a,-(a5) * 行番号対策など
- clr.l 行数
-
-
-
- * グローバル関数ブロックの冒頭処理
- * movem.l 変数INIT,d0/d1
- * sub.l d1,d0
- * move.w d0,(a4)+ * 変数 area を初期化する時の参照するオフセット
- * movem.l 引数INIT,d0/d1
- * sub.l d1,d0
- * move.w d0,(a4)+ * 引き数を取り込む時、参照するオフセット
- clr.l (a4)+ * 最初だから……
-
- * btst #b_argF,d7
- * beq @f
-
- .xref b_argc_def
- bsr b_argc_def
-
- pea.l 引数INIT * デフォルトで引き数を取り込む
- moveq #1,d0 * 引き数の個数 - 1 ( b_argc;int , b_argv();str )
- bsr buf書込 * d1.w/a0-a1 破壊
- move.w #$8000,d0 * int
- bsr buf書込
- moveq #0,d0 * b_argc #
- bsr buf書込
- moveq #0,d0 * dim (1-dimensinal) + b_argv() #
- bsr buf書込L
- addq.l #4,sp
-
-
- * コンパイラ・メインルーチンの始まり始まり
- 解釈ループ0:
- lea.l $100(a4),a0 * チェックのためのちょっと余裕
- cmpa.l mem_last,a0
- bcc mem_err
-
- * a5 から調べ始める。
- * まず、空白(9,10,13,32)を飛ばして、先頭の文字を見る。
- * '/'か(注釈の可能性大)、その他か(プログラムの本文か)
- bsr first_check_a5
- * 数字なら d0 = 0
- * プログラム終了なら d0 = -1
- * その他なら d0 = そのキャラクタ
- tst.w d0
- bmi end
- beq bunpo_err
-
-
- cmpi.b #'}',d0
- beq if_block
- cmpi.b #'?',d0 * print省略形
- bhi 文解釈
- beq print省略形
- cmpi.b #'*',d0
- beq label_star
- cmpi.b #'/',d0 * remark
- bne 文解釈
- cmpi.b #'*',1(a5)
- bne 文解釈
- bsr 行末まで飛ばし * 注釈だ
- bra 解釈ループ0
-
- print省略形:
- addq.l #1,a5
- moveq #5,d0 * 'print'$$$
- bra stat22
-
- label_star:
- addq.l #1,a5
- bsr hash
- bsr @f
- bra 解釈ループ
- label_quote:
- cmpi.b #'"',(a5)+
- bne label_quote_err
- bsr hash_label特別
- bsr @f
- cmpi.b #'"',(a5)+
- bne label_quote_err
- bra 解釈ループ
- @@:
- bsr label_sub * d0 = label #
- move.l d0,d1
- lsl.w #3,d1
- addq.w #4,d1 * 行数の格納位置
- movea.l 4+ラベル,a3
- bsr bufgetL
- addq.l #1,d0
- bne ラベル二重定義
- move.l a4,d2 * address
- bsr bufputL
- rts
- ラベル二重定義:
- ERRORS 81
- label_quote_err:
- ERROR 82
-
- if_block:
- addq.l #1,a5
- ifb2:
- movea.l nest_work,a0
- tst.l (a0)
- beq block_err
- cmpi.w #3,8(a0)
- bne block_err
-
- move.w 10(a0),d0 * if_flag (0/1/2/3)
- btst #0,d0 * block?
- bne ifb1
-
- bsr If_end * if 文で、改行終わりの時
- bra ifb2 * もう一個上にある「はず」
-
- ifb1:
- btst #1,d0 * then/else
- bne ifb3
-
- bsr else_check
- bne ifb3
- addq.l #4,a5
-
- movea.l nest_work,a0
- clr.w 10(a0) * if_flag ( 0 = '{'のない/'}'で閉じた後の then ) (H8/2/1)
- bsr Else
- addq.l #1,a5 * ':' ごたごたしてるけど、とりあえず
- bra 解釈ループ0 * すぐ文
-
-
- ifb3:
- bsr If_end * if 文で、ブロック終わりの時
- bra 解釈ループ
-
- block_err:
- ERROR 31
-
-
-
-
-
-
- 文解釈:
- * 最初の対象を見つけたので
- * これからハッシュ値を計算しながら、文字数を数えさせる
- bsr hash
- * a2.l = 元の対象の開始アドレス
- * d5.w = ハッシュ値だ。上位バイトもそのままだ
- * d4.l = (hash.w)(文字数-1)
- * d1.b = お次の文字 ( (,[,=,:, , etc... )
- tst.w d4
- bmi bunpo_err
-
-
-
- * 対象がどれかステートメントと一致するかどうか
- * a2.l = 元の対象の開始アドレス
- * d5.w = ハッシュ値
- * d4.w = 文字数 - 1
- bsr statement_check
- * 一致すれば d0 = そのステートメント番号
- * 一致しなければ d0 = 0
-
- stat22:
- tst.w d0
- beq ステートメントでない
- cmpi.w #$2a,d0 * 'label'
- beq label_quote
-
- * 各ステートメントごとに文法が違うのでいちいち異なる解釈をしなければ
- * d1.b = お次の文字 ( (,[,=,:, , etc... )
- bsr stat解釈
- bra 解釈ループ
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ステートメントでない:
-
-
- * 関数かどうかチェックする
- cmpi.b #'(',d1
- bne 変数かどうかチェック
-
-
- * d4.l = * (hash.w)(文字数-1)
- * a2.l = 元の対象の開始アドレス
- bsr function_check
- * d0.w = ヒットした関数の返り値の型 ( = 0 : 該当関数無し )
- * = $8000 float
- * = $8001 int
- * = $8003 str
- * = $ffff void
- * d0.w < 0 の時
- * d1.w = 引き数の個数
- * d3.w = 0 から始まる関数番号 ( < 0 : 内部関数になる予定 )
- * a2 = パラメーターテーブル
- tst.w d0
- beq 変数かどうかチェック
-
-
-
-
-
-
- * 関数の処理
- clr.w (a4)+ * 中間言語書き込み
- movea.l a4,a3
- * 関数の解釈
- * input a2 = パラメーターテーブル
- * a3 = 書き込み先アドレス
- * d1.w = 引き数の個数
- * d3.w = 0 から始まる関数番号 ( < 0 : 内部関数になる予定 )
- bsr function解釈
- * d0 = 書き込んだ長さ
- add.l d0,a4
-
- bra 解釈ループ
-
-
-
-
-
-
-
-
- 変数かどうかチェック:
-
- * d4.l = * (hash.w)(文字数-1)
- * a2.l = 元の対象の開始アドレス
- bsr variable_check
- * 重なってない d2.l = -1
- * int の n 番と一致 d2.l = n+0000 ( n < システム変数 )
- * str の n 番と一致 d2.l = n+0100 ( n < システム変数 )
- * char の n 番と一致 d2.l = n+0200
- * float の n 番と一致 d2.l = n+8000
- * d2.l < 0 = 代入出来ない(当たりがない or system 変数)
- * d0 = 0 : 普通の変数
- * 1 : 配列 ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
- * $80 : auto 変数
- * $81 : auto 配列 ( a0 = その配列情報のポインタ , d1 = 添え字の最大数 )
- * -1 : 当たりなし
- bmi misengen
- tst.l d2
- bmi sysに代入
-
- bclr #7,d0
- beq @f
- swap d2
- not.w d2 * AUTO 変数
- swap d2
- @@:
-
- tst.w d0
- beq 配列以外に代入
- * beq 普通の変数に代入
- * 配列に代入
-
- cmpi.b #'(',(a5)
- bne dim_init
-
- move.l d2,-(sp) * 式の型・保存
- moveq #0,d0 * 添え字書き込みサイズ
- move.w $a(a0),d1 * 次元 - 1
- lea.l tmp,a3
- @@:
- addq.l #1,a5
- movem.l d0/d1,-(sp)
- moveq #0,d2 * 添え字は整数だ
- * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
- * int d2.w = 0000
- bsr math解釈
- add.l (sp)+,d0
- move.l (sp)+,d1
-
- cmpi.b #',',(a5)
- dbne d1,@b
- beq 添え字の個数が多い
- tst.w d1
- bne 添え字の個数が少ない
- cmpi.b #')',(a5)+
- bne bunpo_err
-
- move.l (sp)+,d2
- bra 普通の変数に代入
-
-
-
-
-
- * int の n 番と一致 d2.l = n+0000 ( n < システム変数 )
- * str の n 番と一致 d2.l = n+0100 ( n < システム変数 )
- sysに代入:
- tst.w d2
- beq int_sysに代入
- swap d2
- addq.w #1,d2
- beq set_date
- addq.w #2,d2
- beq set_time
- @@:
- ERRORS 58 * date$, time$ 以外に代入
-
-
- int_sysに代入:
- swap d2
- neg.w d2
- * cmpi.w #-9,d2 * システム変数 IntervalTIME か?
- * bne @b
- subi.w #9,d2 * システム変数 ITIME(9) or info_??(~10)
- blt @b * H8/11/11
- move.w #48*2,(a4)+ * statement $$$ 'ItSet'
- move.w d2,-(sp) * 入力するシステム変数の種類
-
- swap d2 * d2.w = $0000(int)
-
- bsr first_check_a5_in_line *
- cmpi.b #'=',(a5)+
- bne bunpo_err
-
- movea.l a4,a3
- * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
- bsr math解釈
- movea.l a3,a4
- move.w (sp)+,(a4)+ * 入力するシステム変数の種類
- bra 解釈ループ
-
-
- set_date:
- clr.w -(sp)
- bra @f
- set_time:
- move.w #1,-(sp)
- @@:
- move.w #41*2,(a4)+ * statement $$$ 'SysVar'
- swap d2 * d2.w = $0100
-
- bsr first_check_a5_in_line *
- cmpi.b #'=',(a5)+
- bne bunpo_err
-
- movea.l a4,a3
- * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
- * str d2.w = 0100
- bsr math解釈
- movea.l a3,a4
- move.w (sp)+,(a4)+
- bra 解釈ループ
-
-
- 配列以外に代入:
- cmpi.b #'[',(a5)
- beq 文字列の途中への代入
-
- 普通の変数に代入:
- move.l d0,-(sp) * 普通の変数になら 0.w
- * 配列,a[i] になら今 tmp 上にある添え字式の長さ ( >0 )
-
- bsr first_check_a5_in_line *
- cmpi.b #'=',(a5)+
- bne bunpo_err
-
- * movea.l a4,a3
- lea.l 2(a4),a3
- * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
- * int d2.w = 0000
- * str d2.w = 0100
- * char d2.w = 0200
- * float d2.w = 8000
- * 型未判明 d2.w = ffff
- bsr math解釈
- * return d6.w = 変数の型(d2=ffff 以外なら d2.l を保存)
-
- lsr.w #8,d6
- bset #15,d6 * 代入式の印、下位バイトは変数の型
- move.l (sp)+,d1
- tst.w d1 * あやしいから
- beq 普通変数代入用中間言語
-
-
- * 配列代入用中間言語
- bset #14,d6 * 配列の印
- move.w d6,(a4)+ * 中間言語書き込み
- add.l d0,a4
- swap d6 * 配列番号
- move.w d6,(a4)+ * 中間言語書き込み
-
- lsr.w #1,d1
- subq.w #1,d1
- bcs sonnahazuhanai
- lea.l tmp,a0 * 添え字の式
- @@:
- move.w (a0)+,(a4)+
- dbra d1,@b
- bra 解釈ループ
-
-
- 普通変数代入用中間言語:
- move.w d6,(a4)+ * 中間言語書き込み
- add.l d0,a4
- swap d6 * 変数番号
- move.w d6,(a4)+ * 中間言語書き込み
- bra 解釈ループ
-
-
-
-
- 文字列の途中への代入:
- * 文字列の途中 a[i]への代入
-
- move.w #38*2,(a4)+ * statement $$$ 'STR'
- move.l d2,-(sp)
-
- addq.l #1,a5
- moveq #0,d2 * 添え字は整数だ
-
- movea.l a4,a3
- * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
- * int d2.w = 0000
- bsr math解釈
-
- cmpi.b #']',(a5)+
- bne bunpo_err
- bsr first_check_a5_in_line
- cmpi.b #'=',(a5)+
- bne bunpo_err
-
- move.w #$0200,d2 * char 型。
- * 解釈した結果を (a3) からに書き込み、その長さを d0.l に返す
- * char d2.w = 0200
- * 型未判明 d2.w = ffff
- bsr math解釈
- * return d6.w = 変数の型(d2=ffff 以外なら d2.l を保存)
- movea.l a3,a4
- move.l (sp)+,d2 * 上位ワードは文字列変数番号
-
- swap d2 * 変数番号
- move.w d2,(a4)+ * 中間言語書き込み
- bra 解釈ループ
-
-
-
-
-
-
-
-
-
- dim_init:
- bsr first_check_a5_in_line
- cmpi.b #'=',d0
- bne bunpo_err
-
- lea.l $a(a0),a0
- move.w (a0)+,d3
- moveq #1,d0
- moveq #0,d1
- @@:
- move.w (a0)+,d1
- addq.l #1,d1
- FPACK __UMUL
- dbra d3,@b
- move.l d0,d1
-
- * 初期化データ
- * d3 = 型
- * d2 = 配列番号
- * d1 = 添え字大きさ
- move.w d2,d3
- lsr.w #8,d3
- swap d2
- bsr dim_init_data
- *bra 解釈ループ
-
-
-
-
-
-
- 解釈ループ:
- bsr first_check_a5_in_line
- bmi 解釈ループ0 * 改行文字だ
- cmpi.b #':',d0
- beq コロン
- cmpi.b #'}',d0 * 'if' block end
- beq 解釈ループ0
-
- cmpi.b #'/',d0 * 注釈
- bne @f
- cmpi.b #'*',1(a5)
- beq 解釈ループ0
- @@:
-
- bsr else_check * else の可能性あり
- bne bunpo_err
- bra 解釈ループ0
-
- コロン:
- addq.l #1,a5
- bra 解釈ループ0
-
-
-
-
-
-
-
-
- * 未宣言変数への代入があれば、警告を出して整数型に勝手に宣言する
- 未宣言をint:
- bsr 未宣言をint_sub
- moveq #0,d0 * 普通の変数に代入につなぐため必要
- bra 普通の変数に代入
-
-
- .xdef misengen
- misengen:
- cmpi.b #'=',(a5)
- beq 未宣言をint
- cmpi.b #'(',(a5)
- bne misengen_var
- ERRORS 34
- bunpo_err:
- ERROR 4
- misengen_var:
- ERRORS 7
- sonnahazuhanai:
- ERROR 2
- 添え字の個数が少ない:
- ERROR 56
- 添え字の個数が多い:
- ERROR 57
-
-
-
-
- * メイン・関数ブロック終了時の処理
- end:
- tst.b d7 * global/auto
- bmi 内部関数あり
-
- * global
- movea.l nest_work,a0
- tst.l (a0)
- bne nest_structure終わってない
-
- move.w #$0013*2,(a4)+ * 'end'$$$
- bsr global変数リスト作成
- bra @f
-
- 内部関数あり:
- bclr #endfuncF,d7
- beq no_endfunc
- @@:
-
-
- move.l a4,変数area
- .xref Goto整理
- bsr Goto整理
-
- * 中間言語にコンパイルするのが終わった
-
-
-
-
- * 変数・引数INIT が連結でなかったら、つなぐ
- lea.l 変数INIT,a1
- bsr chain連結
- lea.l 引数INIT,a1
- bsr chain連結
-
-
- .if 0 *** ワーニング発生チェックは、こBでは無用(有害?) ***
- btst #warningF,d7
- beq @f
- pea.l _warning発生(pc)
- bsr YorN
- addq.l #4,sp
- beq @f
- move.w #1,EXITcode
- bra endendend
- @@:
- .endif ********************************************************
-
- moveq #Finit,d1
- bsr Fルーチン
- moveq #Frun,d1
- bsr Fルーチン
- bset #0,global_flag * Finit通った
-
-
- clr.l 行数
-
- bclr #modeF,d7 * global mode
- clr.w scroll開始行
-
- move.l d7,xbFLAG
- movem.l (sp)+,d3-d7/a3-a6
- moveq.l #0,d0
- rts
-
-
- _kobas_init_err:
- move.l SP_kobas_init,sp * エラーなどで途中で抜ける時のため
- movem.l (sp)+,d3-d7/a3-a6
- moveq #-1,d0
- rts
- SP_kobas_init:
- .dc.l 0
-
-
- .xdef _kobas_exit
- _kobas_exit:
- move.l a6保存(pc),d0
- ble exit_ret
-
- move.l a6,-(sp)
- movea.l d0,a6
-
- movem.l d3/a3,-(sp)
- moveq.l #WINMAX-1,d3
- lea.l _bwp,a3
- 1:
- move.l (a3)+,-(sp)
- beq @f
- bsr _WindowClose
- clr.l -4(a3)
- @@:
- addq.l #4,sp
- dbra d3,1b
- movem.l (sp)+,d3/a3
-
- bclr #0,global_flag
- beq @f
- * KOP '* 外部関数後始末 *',0
- moveq #Fend,d1
- bsr Fルーチン
- moveq #Fexit,d1
- bsr Fルーチン
- @@:
-
- move.l a6,-(sp)
- DOS _MFREE
- addq.l #4,sp
- lea.l a6保存(pc),a2
- clr.l (a2)
-
- move.l (sp)+,a6
-
- exit_ret:
- bsr _WindowConnectionClose
- rts
-
-
-
-
-
-
-
-
-
-
-
-
- * 処理に息詰まったらここに飛んでくるので、
- * 'xb動作mode'の内容に応じて、元の関数の終了処理に戻してやる。
- .xref _kob_driven_err * 0
- *.xref _kobas_init_err * 1
- .xref _kob_exec_err * -1
- .xdef endendend
- endendend:
- movea.l a6保存(pc),a6
- tst.w xb動作mode
- beq _kob_driven_err
- bmi _kob_exec_err
- bge _kobas_init_err
-
-
- help:
- move.w help抑制する(pc),d0
- bne endendend
- pea.l _TITLE(pc)
- KO_PRINT
- pea.l _HELP(pc)
- KO_PRINT
- addq.l #8,sp
- bra endendend
- help抑制する:
- .dc.w 0
-
-
- mem_err0:
- pea.l 1+errmes(pc) * とにかく全然メモリが確保出来なかった
- KO_PRINT
- addq.l #4+4,sp * MALLOC の時のも合わせて
- movem.l (sp)+,d3-d7/a3-a6
- moveq #0,d0 * 異常終了
- rts
-
- mem_err1:
- move.w #-1,関数file数
- ERROR 0
- mem_err:
- ERROR 1
- nest_structure終わってない:
- ERROR 42
- no_endfunc:
- ERROR 43
-
-
-
-
- kobcnf_file:
- .dc.b 'kob.cnf',0
- _TITLE:
- .dc.b $1b,'[1m こBASIC',$1b,'[m ver.0.01 ( H9/3/7 版 ) (c)v914AKSTN.',13,10,0
- _HELP:
- * .dc.b 'とりあえずベーシックのファイル名を指定して実験',13,10
- .dc.b '使用方 : kob.win [-option] BASICファイル名(.kob)',13,10
- .dc.b 9,'-f<数字> : フリーエリアの大きさの指定 ( Kb 単位 )',13,10
- .dc.b 9,'-c<名前> : コンフィグファイル名の指定',13,10
- .dc.b 9,'-e<文字> : 拡張機能の ON/OFF',13,10
- .dc.b 0
- .even
-
-
-
-
- .xdef a6保存
- a6保存:
- .dc.l 0
-
-
- ** ** ** ** ** ** ** ** ** **
-
- .xdef errors
- .xdef error
- .xdef warnings
- .xdef warning
- errors:
- bsr errors_sub
- bra @f
- error:
- bsr error_sub
- @@:
- move.w #1,EXITcode
- bra endendend
- warnings:
- btst #warnoffF,d7
- bne warnend
- movem.l d0-d2/d4/a0-a4,-(sp)
- pea.l _warning(pc)
- KO_PRINT
- addq.l #4,sp
- move.l (sp),d0 * error #
- bsr errors_sub
- bra @f
- warning:
- btst #warnoffF,d7
- bne warnend
- movem.l d0-d2/d4/a0-a4,-(sp)
- pea.l _warning(pc)
- KO_PRINT
- addq.l #4,sp
- move.l (sp),d0 * error #
- bsr error_sub
- @@:
- movem.l (sp)+,d0-d2/d4/a0-a4
- bset #warningF,d7
- warnend:
- rts
-
-
- .xdef errors_sub * インタプリタ側からの直接呼び出し用
- .xdef error_sub * (スタック調整のための苦肉の策)
- errors_sub:
- move.w d0,-(sp)
- lea.l tmp,a0
- move.l a0,-(sp)
- move.b #$27,(a0)+
- @@:
- move.b (a2)+,(a0)+
- dbra d4,@b
- move.b #$27,(a0)+
- move.b #' ',(a0)+
- clr.b (a0)
- KO_PRINT
- addq.l #4,sp
- move.w (sp)+,d0
- bra 1f
- error_sub:
- clr.b tmp
- 1:
- lea.l errmes(pc),a1
- @@:
- tst.b (a1)+
- bne @b
- dbra d0,@b
- move.l a1,-(sp) * error message
- KO_PRINT
- addq.l #4,sp
-
- lea.l $100+tmp,a0 * tag file に書き出す文字列
- move.b #$09,(a0)+
-
-
- move.l 行数,d1
- beq 4f * 行数に関係ないエラー
-
- pea.l tenten(pc)
- KO_PRINT
- move.l d1,(sp) * 行数表示
- bsr dec_print
- pea.l gyou(pc)
- KO_PRINT
- addq.l #8,sp
-
- move.l d1,d0 * tag file
- moveq #6,d1
- FPACK __IUSING
- move.b #' ',(a0)+
- move.b #':',(a0)+
- move.b #' ',(a0)+
- lea.l tmp,a2 * 変数名などの情報
- @@:
- move.b (a2)+,(a0)+
- bne @b
- subq.l #1,a0
- 4:
- pea.l crlf(pc)
- KO_PRINT
- addq.l #4,sp
- rts
-
-
-
- .xdef YorN
- YorN:
- move.l 4(sp),-(sp)
- KO_PRINT
- pea.l _YorN(pc)
- KO_PRINT
- addq.l #8,sp
- DOS _GETCHAR
- move.w d0,-(sp)
- pea.l crlf(pc)
- KO_PRINT
- addq.l #4,sp
- moveq #$20,d0
- or.w (sp)+,d0
- cmpi.b #'y',d0
- rts
-
- _YorN:
- .dc.b ' ( Y or N )',0
-
- _warning発生:
- .dc.b 'ワーニングがありますが、プログラムを実行しますか?',0
- _初期化するか:
- .dc.b '画面を初期化しますか?',0
-
- _warning:
- .dc.b 'Warning : ',0
- tenten:
- .dc.b ' ……',0
- gyou:
- .dc.b '行目',0
- crlf:
- .dc.b 13,10,0
-
-
- errmes: .dc.b 0
- e00: .dc.b 'メモリを確保出来ませんでした',13,10,0
- e01: .dc.b 'フリーエリアが足りませんです',0
- e02: .dc.b 'ぺけBにバグ有り',0
- e03: .dc.b 'そのステートメントは未サポートだ',0
- e04: .dc.b '文法エラー',0
- e05: .dc.b '変数の宣言が変である',0
- e06: .dc.b '二重に宣言するなんて',0
- e07: .dc.b 'そいつは未宣言の変数だろう',0
- e08: .dc.b 'スタックがあふれました',0
- e09: .dc.b '変な式だな',0
- e10: .dc.b 'そのステートメントはまだ実行出来ない',0
- e11: .dc.b 'dim 無しで配列宣言しましたね',0
- e12: .dc.b '行番号がここだけないです',0
- e13: .dc.b '先頭が数字だとややこしいですよ',0
- e14: .dc.b 'コンフィグの書き方が変である',0
- e15: .dc.b '指定された外部関数のファイルが無い',0
- e16: .dc.b '関数の引き数が多いみたいだが',0
- e17: .dc.b 0 *'配列はもうちょっと待つんだ',0
- e18: .dc.b '関数の中に変な引き数があるな',0
- e19: .dc.b '外部関数ファイルのパラメータテーブルがおかしい',0
- e20: .dc.b '外部関数内でエラーだわ',0
- e21: .dc.b 'void 型の関数には返り値はないんだよ',0
- e22: .dc.b 'ステートメントのパラメータの個数が少ない',0
- e23: .dc.b 'color[ に対応する ] がありません',0
- e24: .dc.b 'width に指定出来る値は 64 と 96 だけです',0
- e25: .dc.b 'for 文の書き方がおかしい',0
- e26: .dc.b '使用する変数の型が違う',0
- e27: .dc.b 'next に対応する for がない',0
- e28: .dc.b 'ネスト構造無しに break, continue はできません',0
- e29: .dc.b 'if のない then, else です',0
- e30: .dc.b 'if 文の書き方がおかしい',0
- e31: .dc.b '式の型が違う',0
- e32: .dc.b 'endwhile に対応する while がない',0
- e33: .dc.b 'until に対応する repeat がない',0
- e34: .dc.b '未宣言の関数か配列でないかい',0
- e35: .dc.b '配列の宣言に添え字の指定がありませんよ',0
- e36: .dc.b '配列の宣言がおかしいですよ',0
- e37: .dc.b '配列の添え字が大きすぎます',0
- e38: .dc.b '配列の添え字が負の数のようですね',0
- e39: .dc.b 'func 文の書式に間違いがあるです',0
- e40: .dc.b 'その関数名はすでに使われております',0
- e41: .dc.b '文字列へアクセスするポインタの値がまずいです',0
- e42: .dc.b 'ネスト構造が閉じていませんね',0
- e43: .dc.b 'endfunc がありませんです',0
- e44: .dc.b 'locate のパラメータが無効ですねん',0
- e45: .dc.b 'endfunc or return に対応する func がありませんです',0
- e46: .dc.b 'switch の中で continue ですか?',0
- e47: .dc.b 'case, default, endswitch には switch が必要なんです',0
- e48: .dc.b 'switch にはやっぱり 1 個は case がないと',0
- e49: .dc.b 'func ~ endfunc の中に返り値がありません',0
- e50: .dc.b 'return 文の書き方変',0
- e51: .dc.b 'using 文のフォーマットがおかしい',0
- e52: .dc.b 'using 文の後の ',$27,';',$27,' がないです',0
- e53: .dc.b 'console文のパラメータがまずい',0
- e54: .dc.b 'break しました',0
- e55: .dc.b 'input, linput 文の書き方違う',0
- e56: .dc.b '配列の添え字の個数が少ないんです',0
- e57: .dc.b '配列の添え字の個数が多いんです',0
- e58: .dc.b 'システム変数にゃ代入出来ません',0
- e59: .dc.b '未宣言変数を int 型に割り振ります',0
- e60: .dc.b '配列は10次元までしか扱えないんですゴメンナサイ',0
- e61: .dc.b 'default の後に case, default は置かない方がいいですよね',0
- e62: .dc.b 'exit 文の書き方変である',0
- e63: .dc.b 'key に , がありませんね',0
- e64: .dc.b 'key のパラメーターがまずいです',0
- e65: .dc.b '指定されたコンフィグファイルがありません',0
- e66: .dc.b '行番号の後には空白をお願いします',0
- e67: .dc.b 'input系, key があるので、ファンクションキーを本家互換に書き替えた方がいいです',0
- e68: .dc.b 'エディタを起動出来ません',0
- e69: .dc.b '0で割ること出来ません',0
- e70: .dc.b 'date$, time$ へ変な値を代入しないで下さい',0
- e71: .dc.b 'screen の画面モードが異常です',0
- e72: .dc.b 'こBでは使えない命令です',0 * 'GV-RAM は使用中です',0
- e73: .dc.b 'console の3番目の引数が規定の範囲を超えています',0
- e74: .dc.b '関数の引き数の配列の添字が合いませんのぉ',0
- e75: .dc.b '引き数の配列の次元が合いません',0
- e76: .dc.b 'end がありません',0
- e77: .dc.b '引き数に配列なんか使えません',0
- e78: .dc.b '指定の行番号はありません',0
- e79: .dc.b '使える行番号は 0 から 65535 までなんです',0
- e80: .dc.b '変な goto',0
- e81: .dc.b 'そのラベル名はすでに使用されてます',0
- e82: .dc.b 'label はちゃんと " でくくってください',0
- e83: .dc.b 'goto で関数ブロックの外に飛びだしちゃいけません',0
- e84: .dc.b '配列の添字の大きさには定数しか使えません',0
- e85: .dc.b 'global な可変長配列は使えません',0
- e86: .dc.b 'システム変数 info_?? は auto 変数だから イベント関数の中でしか使えません',0
- .even
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ** ** ** ** ** ** ** ** **
-
- * kob.cnf を読み込んで評価する。
- * d5.w = 関数ファイルの個数
- cnf_read:
- lea.l _SP上限(a6),a3 * work(外部関数名保存)
- lea.l $4000(a3),a5
-
- * .cnf 読み込み
- lea.l cnf_filename,a2
- tst.b (a2)
- beq 1f
- lea.l tmp,a0
- bsr cnf_sub0 * 読み込み
- bge @f
- ERROR 65
- 1:
- lea.l kobcnf_file(pc),a2 * default name 'kob.cnf'
- bsr cnf_sub
- bmi help
- @@:
-
- moveq #0,d5 * 関数ファイルの個数
- moveq #1,d0
- move.l d0,行数
- cr_loop:
- bsr first_check_a5
- * 数字なら d0 = 0
- * ファイル終了なら d0 = -1
- * その他なら d0 = そのキャラクタ
- tst.w d0
- beq cf_err
- bmi cf_end
-
- cmpi.b #'*',d0
- beq cnf_cont
-
- lea.l _cnfS(pc),a2 * config の命令 list
- bsr fc_check_sub
- * d6 = 命令番号*2 (-1=該当無い)
- bmi cf_err
-
- bsr first_check_a5
- cmpi.b #'=',(a5)+
- bne cf_err
-
- bsr first_check_a5
- tst.w d0
- bmi cf_err
-
- move.w cc(pc,d6.w),d6
- jmp cc(pc,d6.w)
- cc:
- .dc.w Func-cc
- .dc.w Beep-cc
- .dc.w Caps-cc
- .dc.w Free-cc
- .dc.w Width-cc
- .dc.w Warn-cc
- .dc.w Extend-cc
-
- _cnfS:
- .dc.b 'func',0
- .dc.b 'beep',0
- .dc.b 'caps',0
- .dc.b 'free',0
- .dc.b 'width',0
- .dc.b 'warn',0
- .dc.b 'extend',0
- .dc.b 0
-
- _cnfT:
- .dc.b 'on',0 * 0
- .dc.b 'off',0
- .dc.b 'always',0 * 4
- .dc.b 'ask',0
- .dc.b 'never',0
- .dc.b 'auto',0 * 10
- .dc.b 0
- .even
-
- Free:
- movea.l a5,a0
- FPACK __STOL
- movea.l a0,a5
- tst.w _FREEMEM(a6)
- bne cnf_cont
- move.w d0,_FREEMEM(a6)
- bra cnf_cont
-
- Beep:
- Caps:
- Width:
- bra cnf_cont * 飾り
-
-
-
- Warn:
- moveq #warnoffF,d2
- bsr fc_check_subT
- beq WarnOn
- subq.w #2,d6
- bne cf_err
- WarnOff:
- bset d2,d7
- bra cnf_cont
- WarnOn:
- bclr d2,d7
- bra cnf_cont
-
-
- Extend:
- clr.w d0
- move.b (a5)+,d0
- cmpi.b #$20,d0
- bcs @f
- ori.b #$20,d0
- subi.b #'a',d0
- bcs cf_err
- cmpi.b #'z'-'a',d0
- bhi cf_err
- move.b _ext_flag(pc,d0.w),d0
- beq cf_err
- bset d0,d7
- bra Extend
- @@:
- subq.l #1,a5
- bra cnf_cont
- _ext_flag:
- .dc.b 0
- .dc.b 0,0,fnc_dimF,len_dimF,0 * b,c,d,e
- .dc.b 0,0,v_initF,0,0 * g,h,i
- .dc.b labelF,0,0,0,0 * l
- .dc.b 0,0,0,0,0
- .dc.b 0,0,0,0,0
-
-
- Func:
- addq.w #1,d5 * 関数ファイルの個数 ++
- @@:
- move.b (a5)+,d0
- cmpi.b #$20,d0
- bcs @f
- move.b d0,(a3)+
- bra @b
- @@:
- clr.b (a3)+
- subq.l #1,a5
- * bra cnf_cont
-
- cnf_cont:
- bsr 行末まで飛ばし
- bra cr_loop
-
-
- cf_end:
- subq.w #1,d5 * 関数ファイルの個数 - 1
- move.w d5,関数file数
- rts
-
- cf_err:
- clr.b basic_filename
- ERROR 14
-
-
-
- * .cnf の読み込み
- cnf_sub:
- lea.l tmp,a0
- lea.l 起動dir,a1
- @@:
- move.b (a1)+,(a0)+
- bne @b
- subq.l #1,a0
- cnf_sub0:
- move.b (a2)+,(a0)+
- bne cnf_sub0
-
- clr.w -(sp)
- pea.l tmp
- DOS _OPEN
- addq.l #6,sp
- tst.l d0
- bmi cnf_ret
-
- move.l #$2000-1,-(sp) * .cnf size の上限 $2000-1 (問題ないでしょう)
- move.l a5,-(sp)
- move.w d0,-(sp)
- DOS _READ
- clr.b (a5,d0.l) * でりみた
- DOS _CLOSE
- lea.l 10(sp),sp
- moveq #0,d0
- cnf_ret:
- rts
-
-
-
- fc_check_subT:
- lea.l _cnfT(pc),a2
- fc_check_sub:
- moveq #0,d6
- fc_check2:
- tst.b (a2)
- beq fc_checkend
- movea.l a5,a0
- @@:
- move.b (a2)+,d0
- beq fc_ok
- moveq #$20,d1
- or.b (a0)+,d1
- cmp.b d1,d0
- beq @b
- @@:
- tst.b (a2)+ * 次へ
- bne @b
- addq.w #2,d6
- bra fc_check2
- fc_ok:
- moveq #$20,d1
- or.b (a0),d1 * 英字以外でないと
- cmpi.b #'a',d1
- bcs @f
- cmpi.b #'z',d1
- bcs fc_checkend
- @@:
- movea.l a0,a5
- tst.w d6 * 0 以上
- rts
- fc_checkend:
- moveq #-1,d6
- rts
-
-
-
- ** ** ** ** ** ** ** ** **
-
- * 外部関数読み込みサブ
- func_read:
- move.w 関数file数,d5
- move.l a4,関数list
- movea.l a4,a3 * 関数ファイルのリスト
- move.w d5,d0
- bmi fnc_整理整頓
- lsl.w #2,d0
- lea.l 4(a4,d0.w),a4 * + 4+4*(関数の個数 - 1)
-
- lea.l _SP上限(a6),a2
- fr_loop:
- lea.l tmp,a0 * '=' の後ろ
-
- .ifndef _DEBUG * _DEBUG が定義されてなければ
- lea.l 起動dir,a1 * 起動ディレクトリから探す
- @@:
- move.b (a1)+,(a0)+
- bne @b
- subq.l #1,a0
- .endif
-
-
- @@:
- move.b (a2)+,(a0)+
- bne @b
- move.b #'.',-1(a0)
- move.b #'f',(a0)+
- move.b #'n',(a0)+
- move.b #'c',(a0)+
- clr.b (a0)
-
-
-
- .ifdef _DEBUG * _DEBUG が定義されてると
- clr.l -(sp) * PATH の通ったディレクトリから探す
- pea.l $100+tmp
- pea.l tmp
- move.w #2,-(sp)
- DOS _EXEC
- lea.l 14(sp),sp
- tst.l d0
- bmi fnc_err
- .endif
- move.l mem_last,-(sp) * limit address
- move.l a4,-(sp)
- pea.l tmp
- move.b #3,(sp) * X 形式のファイルとして読み込み
- move.w #3,-(sp)
- DOS _EXEC
- lea.l 14(sp),sp
- tst.l d0
- ble fnc_err
-
- * 登録
- move.l a4,(a3)+
- * addq.l #3,d0
- * andi.b #$fc,d0 * あんまり関係ないからいらない?
- adda.l d0,a4
-
- dbra d5,fr_loop
-
-
- fnc_整理整頓:
- * 読み込みが終了したので、外部関数の整理整頓をする。
- moveq #-1,d6 * 関数の個数 - 1
-
- movea.l 関数list,a3
- move.l a4,関数buf
- lea.l _SP上限(a6),a4
-
- .xref standard_init
- bsr standard_init
- .xref kofunc_init
- bsr kofunc_init
-
- move.w 関数file数,d5
- bmi fnc_end2
- func_init_loop:
- movea.l (a3)+,a0
- move.l Ftokun(a0),a5
- movem.l Fpara(a0),a0-a1
- * a5 = トークン テーブルの先頭アドレス
- * a0 = パラメータ
- * a1 = 実行アドレス
- move.w d5,-(sp)
- bsr func_hash
- move.w (sp)+,d5
- dbra d5,func_init_loop
- fnc_end2:
- movea.l 関数buf,a4
- move.w d6,関数個数
-
- lea.l _SP上限(a6),a3 * とりあえず作った関数テーブル
- lea.l 外部functable,a5 * 本物の関数テーブルを格納
- bsr func_sort
- rts
-
- fnc_err:
- move.w #-1,関数file数
- cmpi.w #$fff8,d0 * メモリが足りない
- beq mem_err
- ERROR 15
-
-
-
-
-
-
- * a3 から始まる (d6+1) 個のハッシュ値付きのテーブルを a4 に並べ直す。
- * a5 に参照用テーブルを作る
- func_sort:
- move.w d6,d4
- addq.w #1,d4
- lsl.w #2,d4
- suba.w d4,sp
- movea.l sp,a0
- move.w d6,d0
- @@:
- move.l a3,(a0)+
- lea.l $10(a3),a3
- dbra d0,@b
-
-
- move.w d6,d2
- subq.w #1,d2
- bmi fs_loop_end
- lea.l 4(sp),a3
- fs_loop:
- movea.l (a3),a0
- move.b 1(a0),d0
- move.w d6,d5
- sub.w d2,d5
- subq.w #1,d5
- movea.l a3,a2
- @@:
- movea.l -(a2),a1
- cmp.b 1(a1),d0 * hash の下1バイト
- bcc @f
- move.l a1,4(a2)
- dbra d5,@b
- subq.l #4,a2
- @@:
- move.l a0,4(a2)
- addq.l #4,a3
- dbra d2,fs_loop
-
- fs_loop_end:
-
- moveq #0,d0
- moveq #-1,d1
- moveq #0,d2
- movea.l sp,a1
- clr.w (a5)+ * 関数buf からのオフセット
-
- fs_2:
- movea.l (a1)+,a0
- @@:
- cmp.b 1(a0),d0
- beq fs_1
-
- move.w d1,(a5)+ * 個数
- move.w d2,(a5)+ * 関数buf からのオフセット
-
- addq.b #1,d0
- moveq #-1,d1
- bra @b
-
- fs_1:
- move.l (a0)+,(a4)+
- move.l (a0)+,(a4)+
- move.l (a0)+,(a4)+
- move.l (a0)+,(a4)+
- addq.w #1,d1
- add.w #$10,d2
- dbra d6,fs_2
-
- move.w d1,(a5)+ * 個数
- move.w #$100-2,d1
- sub.w d0,d1
- bmi fs_3
- moveq #-1,d0
- @@:
- move.l d0,(a5)+ * 残りを埋める
- dbra d1,@b
-
- fs_3:
- adda.w d4,sp
- rts
-
-
-
-
- * (a5) から始まるトークンリストからハッシュ値を計算してテーブルを作る
- func_hash:
- tst.b (a5)
- beq fi_loop1_end
- fi_loop1:
- bsr hash
- * a2.l = 元の対象の開始アドレス
- * d4.l = (hash.w)(文字数 - 1)
- move.l d4,(a4)+ * (hash.w)(文字数 - 1)
- move.l a2,(a4)+ * 名前
- move.l (a0)+,(a4)+ * パラメータリストを指すポインタ
- move.l (a1)+,(a4)+ * 実行アドレス
- * おんなじ名前の関数もあるかもしれないが、そのまま登録してまおう
- * 上から一致を見ていくから、先に登録したものが優先となるはず
-
- addq.w #1,d6
- addq.l #1,a5 * $00
-
- tst.b (a5)
- bne fi_loop1
- fi_loop1_end:
- rts
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- * プログラム全体から 'func' の文字列を探しだし、
- * 内部関数の宣言なら登録する。
- 内部関数:
- move.l a4,内部関数para
-
- lea.l -$10*$400(sp),sp * 内部関数の個数の上限 1024 (大丈夫……かな?)
- movea.l sp,a4 * 内部関数buf_tmp
- move.l a4,内部関数buf
-
- lea.l tmp,a0 * func を探すための BM法テーブル
- move.l #$04040404,d0
- moveq #32/4-1,d1
- @@:
- move.l d0,(a0)+
- dbra d1,@b
- move.l #$05050505,d0
- moveq #(256-32)/4-1,d1
- @@:
- move.l d0,(a0)+
- dbra d1,@b
-
- lea.l tmp,a0
- move.b #4,' '(a0)
- move.b #3,'f'(a0)
- move.b #2,'u'(a0)
- move.b #1,'n'(a0)
- clr.b 'c'(a0)
-
- move.w #-1,内部関数個数
-
- addq.l #4,a5
- search_func_loop:
- clr.w d0
- move.b (a5),d0
- move.b (a0,d0.w),d0
- bne func_next
-
- moveq #4+1,d0
- movea.l a5,a1
- cmpi.b #'n',-(a1)
- bne func_next
- cmpi.b #'u',-(a1)
- bne func_next
- cmpi.b #'f',-(a1)
- bne func_next
-
- @@:
- move.b -(a1),d1 * 前の文字は空白・行番号を飛ばすと改行 ($a) でなきゃ
- cmpi.b #32,d1
- beq @b
- cmpi.b #9,d1
- beq @b
- cmpi.b #'9',d1
- bhi func_next
- cmpi.b #'0',d1
- bcc @b
-
- cmpi.b #$a,d1
- bne func_next
-
- move.b 1(a5),d1 * 次の文字(空白・TAB)
- cmpi.b #' ',d1
- beq func_hit
- cmpi.b #9,d1
- bne func_next
- func_hit:
- movem.l a0/a2,-(sp)
- bsr 内部関数登録
- movem.l (sp)+,a0/a2
- moveq #4,d0
- func_next:
- adda.w d0,a5
- cmpa.l a2,a5
- bcs search_func_loop
-
- movea.l 内部関数para,a4
- move.l a4,内部関数buf
- move.w 内部関数個数,d1 * buf_tmp からコピー
- bmi 1f
- movea.l sp,a0
- @@:
- move.l (a0)+,(a4)+
- move.l (a0)+,(a4)+
- move.l (a0)+,(a4)+
- move.l (a0)+,(a4)+
- dbra d1,@b
- 1:
- lea.l $10*$400(sp),sp
- rts
-
-
-
-
- 内部関数登録:
- addq.l #1,a5
- * 型を得る(省略なら int )
- bsr 型getS
- * (INT,STR,CHAR,FLOAT)
- * d1.w 型を返す( 0, 2, 4, 6)
- move.w d1,-(sp)
-
- bsr first_check_a5_in_line
- * ハッシュ値を計算しながら、文字数を数える
- bsr hash
- * a2.l = 元の対象の開始アドレス
- * d4.l = (hash.w)(文字数-1)
- tst.w d4
- bmi func文err
-
- bsr statement_check
- * 一致しなければ d0 = 0
- tst.w d0
- bne func_double_def
-
- bsr function_check
- * d0.w = ヒットした関数の返り値の型 ( = 0 : 該当関数無し )
- tst.w d0
- bne func_double_def0
-
-
-
- * 内部関数登録
- addq.w #1,内部関数個数
-
- move.l d4,(a4)+ * (hash.w)(文字数 - 1)
- bsr 名前登録 * a2,d4 破壊
- move.l a0,(a4)+ * 名前
-
- movea.l 内部関数para,a3
- move.l a3,(a4)+ * パラメータリストを指すポインタ
- clr.l (a4)+ * 実行アドレス(念のためクリアしとく)
-
-
- cmpi.b #'(',(a5)+
- bne func文err0
- bsr first_check_a5_in_line
- cmpi.b #')',d0
- beq 内部関数登録loop_end
-
- 内部関数登録loop:
- bsr first_check_a5_in_line
- bsr hash * 引き数名(今は無視)
-
- cmpi.b #'(',(a5)
- bne @f
- bsr 配列引き数
- bra 内部関数登録cont
-
- @@:
- moveq #$0,d1 * int引き数
- * bsr first_check_a5_in_line
- cmpi.b #';',(a5)
- bne @f
-
- addq.l #1,a5
- bsr 型getS * d0/d1:return, a0/a2:破壊
- * d0 = 0 省略せず
- * = 1 省略
- bne func文err0
- @@:
- move.w _引き数の型(pc,d1.w),(a3)+
-
- 内部関数登録cont:
- bsr first_check_a5_in_line
- addq.l #1,a5
- cmpi.b #',',d0
- beq 内部関数登録loop
-
- cmpi.b #')',d0
- bne func文err0
- 内部関数登録loop_end:
- move.w (sp)+,d1 * 返り値の型
- move.w _返り値の型(pc,d1.w),(a3)+
- move.l a3,内部関数para
- rts
-
- _引き数の型:
- .dc.w $0002,$0008,$0004,$0001
- _返り値の型:
- * .dc.w int_ret,str_ret,char_ret,float_ret
- .dc.w $8001,$8003,$8002,$8000
- * ^^^^^ 新設
-
-
-
- 配列引き数:
- btst #fnc_dimF,d7
- beq 配列引き数err
-
- movem.l d2/d3,-(sp)
- moveq #-1,d1 * 次元 - 1
- moveq #0,d2 * 添字大きさ指定フラグ
- lea.l 6(a3),a2 * $8080.w, 型.b, 次元-1.b, 添字flag.w
- @@:
- addq.l #1,a5 * '(',','
- bsr first_check_a5_in_line
- cmpi.b #')',d0
- beq 2f
- cmpi.b #',',d0
- bne 1f
- addq.w #1,d1 * 次元++
- clr.w (a2)+ * 一応
- bra @b
- 1:
- bsr int定数get * 添字大きさ
- cmpi.l #$10000,d0
- bcc func文err0
-
- addq.w #1,d1 * 次元++
- move.w d0,(a2)+
- moveq #$f,d0
- sub.w d1,d0
- bset d0,d2 * 添字大きさ指定フラグ set
-
- bsr first_check_a5_in_line
- cmpi.b #')',d0
- beq 3f
- cmpi.b #',',d0
- beq @b
- bra func文err0
-
- 2:
- addq.w #1,d1 * 次元++
- clr.w (a2)+ * 一応
- 3:
- addq.l #1,a5
- tst.w d2
- bne 拡張配列引き数 * 添字大きさ指定フラグが一個でもあれば
- cmpi.w #1,d1
- bhi 拡張配列引き数 * 三次元以上なら
-
- beq @f
- moveq #$0020,d2 *普通の1次元
- bra 1f
- @@:
- moveq #$0040,d2 *普通の2次元
- 1:
- moveq #$0,d1 * int引き数
- bsr first_check_a5_in_line
- cmpi.b #';',d0
- bne @f
-
- addq.l #1,a5
- bsr 型getS * d0/d1:return, a0/a2:破壊
- * d0 = 0 省略せず
- * = 1 省略
- bne func文err0
- @@:
- lea.l _引き数の型(pc),a0
- add.w (a0,d1.w),d2 * 2次元以下配列型指定
- move.w d2,(a3)+
- movem.l (sp)+,d2/d3
- rts
-
-
- 拡張配列引き数:
- cmpi.w #10,d1
- bcc func文err0 * 11次元以上
-
- move.l a2,-(sp)
- move.w #$8080,(a3)+ * 拡張配列引き数
-
- bsr first_check_a5_in_line
-
- moveq #0,d0 * int
- cmpi.b #';',(a5)
- bne @f
- addq.l #1,a5
- movem.l d1/a1,-(sp)
- bsr 型getS * d0/d1:return, a0/a2:破壊
- * d0 = 0 省略せず
- * = 1 省略
- bne func文err0
- move.w _引き数の型2(pc,d1.w),d0
- movem.l (sp)+,d1/a1
- @@:
- or.w d1,d0
- move.w d0,(a3)+ * 型+次元-1
- move.w d2,(a3)+ * 添字大きさ指定フラグ
- movea.l (sp)+,a3
- movem.l (sp)+,d2/d3
- rts
- _引き数の型2:
- .dc.w $0000,$0100,$0200,$8000
-
-
-
-
- 配列引き数err:
- bsr line算出
- ERRORS 77 * 配列名を表示
- func文err0:
- movea.l -$10+4(a4),a2
- move.w -$10+2(a4),d4
- bsr line算出
- ERRORS 39 * 関数名を表示
- func文err:
- bsr line算出
- ERROR 39
- func_double_def0:
- movea.l -$10+4(a3),a2
- move.w -$10+2(a3),d4
- func_double_def:
- bsr line算出
- ERRORS 40
-
- * 何行目かを出す
- line算出:
- move.l a5,d1
- sub.l program_area,d1
- moveq #1,d2
- line算出loop:
- cmpi.b #$a,-(a5)
- bne @f
- addq.l #1,d2
- @@:
- subq.l #1,d1
- bne line算出loop
- move.l d2,行数
- rts
-
-
-
-
-
-
-
-
-
-
-
-
-
- * 外部関数のさまざまなルーチンを呼ぶ
- Fルーチン:
- movem.l d0-d7/a0-a6,-(sp)
- moveq #0,d0
- move.w 関数file数,d0
- bmi no_func_file1
- * KH '関数file数 = ',d0
- movea.l 関数list,a5
- * KH '関数list = ',a5
- @@:
- movea.l (a5)+,a0
- move.l (a0,d1.w),a0
- movem.l d0/d1/a5,-(sp)
- jsr (a0) * run 実行時の初期化ルーチン
- movem.l (sp)+,d0/d1/a5
- dbra d0,@b
- no_func_file1:
- movem.l (sp)+,d0-d7/a0-a6
- rts
-
-
-
-
-
-
- * d2 : 4
- * -4(a2) : 'h:/ko/kob.win',0
- * (a2) : '-f ',0
- * 4(a2) : '640',0
- * 8(a2) : 'sin.kob',0
- * コマンドラインの評価
- com_est:
-
- ce_loop:
- subq.w #1,d2
- beq help * プログラム名が現れない
-
- movea.l (a2)+,a0
-
- move.b (a0)+,d0
- cmpi.b #'-',d0
- bne ce_file
-
- moveq #$20,d0
- or.b (a0)+,d0
- cmpi.b #'c',d0
- beq sw_c
- cmpi.b #'e',d0
- beq sw_e
- cmpi.b #'f',d0
- beq sw_f
- cmpi.b #'n',d0
- beq sw_n
- bra help
-
-
- sw_arg:
- tst.b (a0)
- bne @f
- subq.w #1,d2
- beq sw_help * オプション引き数がない
- movea.l (a2)+,a0
- @@:
- rts
- sw_help:
- addq.l #4,sp
- bra help
-
-
- sw_n: * ヘルプ抑制
- move.w #1,help抑制する
- bra ce_loop
-
- sw_f:
- bsr sw_arg
- FPACK __STOL
- move.w d0,_FREEMEM(a6)
- bra ce_loop
-
- sw_e:
- movem.l EXTENDmask,d1/d3 * OFFmask/ONmask
- lea.l _ext_flag(pc),a1
- @@:
- move.b (a0)+,d0
- subi.b #'A',d0
- bcs sw_e_end
- cmpi.b #26,d0
- bcc sw_e_off
- move.b (a1,d0.w),d0
- beq help
- bset d0,d3 * ONmask
- bra @b
- sw_e_off:
- subi.b #'a'-'A',d0
- bcs help
- cmpi.b #26,d0
- bcc help
- move.b (a1,d0.w),d0
- beq help
- bclr d0,d1 * OFFmask
- bra @b
-
- sw_e_end:
- movem.l d1/d3,EXTENDmask
- bra ce_loop
-
- sw_c:
- bsr sw_arg
- lea.l cnf_filename,a1
- @@:
- move.b (a0)+,(a1)+
- bne @b
- bra ce_loop
-
- ce_file:
- subq.l #1,a0
- lea.l basic_filename,a1
- @@:
- move.b (a0)+,(a1)+
- bne @b
- bsr b_argv展開
- rts
-
-
-
-
- b_argv展開:
- addq.l #2,a4 * 項目をロングワード境界に
- move.l a4,b_argv
-
- clr.l (a4)+ * 次を指す offset (dummy)
- move.l #$0000_00ff,(a4)+ * (次元 - 1)_(データサイズ)
- move.l a4,-(sp)
- addq.l #2,a4 * 要素数
-
- lea.l _SP上限(a6),a1
- move.l a1,-(sp)
- pea.l basic_filename
- DOS _NAMECK
- addq.l #8,sp
-
- movea.l a4,a0
- bsr barg_sub * drive & path
- lea.l 2+65+_SP上限(a6),a1
- bsr barg_sub * file name
- lea.l 2+65+19+_SP上限(a6),a1
- bsr barg_sub * ext name
- lea.l $100(a4),a4
- moveq #0,d1 * 要素数
-
- barg_loop:
- subq.w #1,d2
- beq barg_end
- movea.l (a2)+,a0
- movea.l a4,a1
- @@:
- move.b (a0)+,(a1)+
- bne @b
- lea.l $100(a4),a4
- addq.w #1,d1 * 要素数
- bra barg_loop
- barg_end:
- movea.l (sp)+,a0
- move.w d1,(a0) * b_argv 配列サイズ
- addq.w #1,d1
- move.l d1,b_argc
- rts
-
-
- barg_sub:
- move.b (a1)+,(a0)+
- bne barg_sub
- subq.l #1,a0
- rts
-
-
-
-
-
-
-
-
-
- .xdef dec_print
- dec_print:
- movem.l d0-d2/a0,-(sp)
- move.l 4+4*4(sp),d2
- bmi dec_minus
-
- bsr DECP
- move.b #$20,-(a0)
- bra dec_plus
-
- dec_minus:
- neg.l d2
- bsr DECP
- move.b #'-',-(a0)
- dec_plus:
- move.l a0,-(sp)
- KO_PRINT
- addq.l #4,sp
-
- movem.l (sp)+,d0-d2/a0
- rts
-
-
-
- DECP:
- lea.l $100+tmp,a0
- move.w #$20_00,-(a0)
- moveq #10,d1
- decp2:
-
- swap d2
- moveq #0,d0
- move.w d2,d0
- divu d1,d0
- beq decp3
- move.w d0,d2
- swap d2
- move.w d2,d0
- divu d1,d0
- move.w d0,d2
- swap d0
-
- addi.b #$30,d0
- move.b d0,-(a0)
- bra decp2
-
- decp3:
- swap d2
- decp4:
- divu d1,d2
- swap d2
- addi.b #$30,d2
- move.b d2,-(a0)
- clr.w d2
- swap d2
- bne decp4
-
- rts
-
-
-
-
-
-
- * a5 の指す中間言語のアドレスが何行目かを計算して '行数' に返す
- .xdef I行数算出
- I行数算出:
- moveq #0,d1
- movea.l 4+中間言語行数,a3
- move.l 中間言語,a1
- @@:
- bsr bufget
- adda.w d0,a1
- addq.w #1,d1
- cmpa.l a5,a1
- bcs @b
- subq.l #1,d1
- move.l d1,行数
- rts
-
-
-
-
-
- * メモリの最後尾(mem_last)から、 d0.w だけのメモリを確保して、
- * アドレスを a0に返す
- .xdef malloc
- malloc:
- movea.l mem_last,a0
- suba.w d0,a0
- move.l a0,mem_last
- rts
-
-
- * 鎖状のバッファ(size = CbufSIZE * word )を malloc して、d0.w を書き込む
- * d1.w/a0-a1 破壊
- .xdef buf書込L
- buf書込L:
- move.l 4(sp),-(sp)
- swap d0
- bsr buf書込
- swap d0
- bsr buf書込
- addq.l #4,sp
- rts
-
- .xdef buf書込
- buf書込:
- movea.l 4(sp),a1
- addq.w #1,8(a1)
- move.w 8(a1),d1
- andi.w #CbufSIZE-1,d1
- bne 3f
-
- move.w d0,d1
- move.w #CbufSIZE*2+4,d0
- bsr malloc
- move.w d1,d0
- move.w 8(a1),d1
- bne 1f
- move.l a0,4(a1) * 先頭登録
- bra 4f
- 1:
- movea.l (a1),a1 * 今の鎖の最後尾
- move.l a0,(a1) * 次の鎖へのつなぎ
- movea.l 4(sp),a1 * もう一回復活
- bra 4f
-
- 3:
- move.l (a1),a0 * 今の書き込みポインタ
- 4:
- move.w d0,(a0)+
- move.l a0,(a1) * 書き込みポインタ登録
- rts
-
-
-
- * 鎖状のバッファ(size = CbufSIZE * word )の先頭を a3 で指定して
- * d1 で指されたデータを d0.w に返す
- .xdef bufget
- bufget:
- move.l a3,-(sp)
- move.w d1,d0
- @@:
- subi.w #CbufSIZE,d0
- bcs @f
- movea.l CbufSIZE*2(a3),a3
- bra @b
-
- @@:
- addi.w #CbufSIZE,d0
- add.w d0,d0
- move.w (a3,d0.w),d0
-
- movea.l (sp)+,a3
- rts
-
-
- * 鎖状のバッファ(size = CbufSIZE * word )の先頭を a3 で指定して
- * d1 で指された位置に d2 を書き込む (d0.w 破壊)
- .xdef bufput
- bufput:
- move.l a3,-(sp)
- move.w d1,d0
- @@:
- subi.w #CbufSIZE,d0
- bcs @f
- movea.l CbufSIZE*2(a3),a3
- bra @b
-
- @@:
- addi.w #CbufSIZE,d0
- add.w d0,d0
- move.w d2,(a3,d0.w)
-
- movea.l (sp)+,a3
- rts
-
-
- .xdef bufgetL
- bufgetL:
- bsr bufget
- swap d0
- addq.w #1,d1
- bsr bufget
- subq.w #1,d1
- rts
- bufputL:
- swap d2
- bsr bufput
- swap d2
- addq.w #1,d1
- bsr bufput
- subq.w #1,d1
- rts
-
-
- * 鎖バッファ が連結でなかったら、つなぐ
- .xdef chain連結
- chain連結:
- move.w 8(a1),d0
- cmpi.w #CbufSIZE,d0
- bcs 連結必要無し
-
- move.w d0,d1
- add.w d0,d0
- bsr malloc
- movea.l 4(a1),a2
- move.l a0,4(a1)
- move.w #CbufSIZE,d0
- @@:
- move.w (a2)+,(a0)+
- subq.w #1,d0
- dbeq d1,@b
- bne 連結終
- movea.l (a2),a2
- move.w #CbufSIZE,d0
- dbra d1,@b
- 連結終:
- move.l a0,(a1)
- 連結必要無し:
- rts
-
-
-
- .end
-
-